// Windows 平台函数封装

#ifndef fz_h
#define fz_h

#include <Windows.h>
#include <cstdarg>
#include <iostream>
#include <stdint.h>

// 0 黑色
// 1 蓝色
// 2 绿色
// 3 浅绿色
// 4 红色
// 5 紫色
// 6 黄色
// 7 白色
// 8 灰色
// 9 淡蓝色
// A 淡绿色
// B 淡浅绿色
// C 淡红色
// D 淡紫色
// E 淡黄色
// F 亮白色

// 前景色
#define COLOR_BLACK 0x00
#define COLOR_BLUE 0x01
#define COLOR_GREEN 0x02
#define COLOR_CYAN 0x03
#define COLOR_RED 0x04
#define COLOR_VIOLET 0x05
#define COLOR_YELLOW 0x06
#define COLOR_LGREY 0x07
#define COLOR_GREY 0x08
#define COLOR_LBLUE 0x09
#define COLOR_LGREEN 0x0A
#define COLOR_LCYAN 0x0B
#define COLOR_LRED 0x0C
#define COLOR_LVIOLET 0x0D
#define COLOR_LYELLOW 0x0E
#define COLOR_WHITE 0x0F

// 背景色
#define COLOR_BLACK_BACKGROUND 0x00
#define COLOR_BLUE_BACKGROUND 0x10
#define COLOR_GREEN_BACKGROUND 0x20
#define COLOR_CYAN_BACKGROUND 0x30
#define COLOR_RED_BACKGROUND 0x40
#define COLOR_VIOLET_BACKGROUND 0x50
#define COLOR_YELLOW_BACKGROUND 0x60
#define COLOR_LGREY_BACKGROUND 0x70
#define COLOR_GREY_BACKGROUND 0x80
#define COLOR_LBLUE_BACKGROUND 0x90
#define COLOR_LGREEN_BACKGROUND 0xA0
#define COLOR_LCYAN_BACKGROUND 0xB0
#define COLOR_LRED_BACKGROUND 0xC0
#define COLOR_LVIOLET_BACKGROUND 0xD0
#define COLOR_LYELLOW_BACKGROUND 0xE0
#define COLOR_WHITE_BACKGROUND 0xF0

/**
 * 指定颜色
 *
 * @param color 颜色，参考 COLOR 枚举
 * @param format 格式化字符串
 * @param ... 参数列表
 */
void ColorPrintf(int color, const char *format, ...) {
  HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
  CONSOLE_SCREEN_BUFFER_INFO consoleInfo;
  WORD saved_attributes;
  GetConsoleScreenBufferInfo(hConsole, &consoleInfo);
  saved_attributes = consoleInfo.wAttributes;
  va_list ap;
  va_start(ap, format);
  SetConsoleTextAttribute(hConsole, color);
  vprintf(format, ap);
  va_end(ap);
  SetConsoleTextAttribute(hConsole, saved_attributes);
}

#endif